#include "HufArc.h"
#include <stdarg.h>
/*
ADD_FILES 1
EXTR_FILE_ 2
FUNC_INI 2
LISTING_FILE 3
OPEN_ARC 4
TESTING 5
COPY_ARC 6
DEL_FILE 7
CLEAN_FILE 8
WRITE_ERR_AF_2 21
WRITE_ERR_AF_1 22

*/
int cl_exit (int func,int flag, ...)
{
	//jmp_buf errorBuf;
	va_list ap;
	FILE * file_1 = NULL;
	FILE ** file_2 = NULL;
	char * buf_1 = NULL;
	char * buf_2 = NULL;
	char m;
	fileHead * fileHd_1 = NULL;
	fileHead **fileHd_2 = NULL;
	struct stat * statFile = NULL;
	int i = 0;

	va_start (ap,flag);

	switch (func) {

	case ADD_FILES:
		file_2 = va_arg (ap,FILE **);
		m = va_arg (ap,int);
	if (file_2)
		{
			if (file_2[0])
				fclose (file_2[0]);
			if (file_2[1])
				fclose (file_2[1]);
		}
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		fileHd_1 = va_arg (ap,fileHead *);
		if (fileHd_1)
		{
			if (fileHd_1->fileName)
				free (fileHd_1->fileName);
			free (fileHd_1);
		}
		file_1 = va_arg (ap,FILE *);
		if (file_1)
			free (file_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;	
	case CLEAN_FILE:
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case COPY_ARC:
		file_2 = va_arg (ap,FILE **);
		if (file_2)
		{
			if (file_2[0])
				fclose (file_2[0]);
			if (file_2[1])
				fclose (file_2[1]);
		}
		fileHd_2 = va_arg (ap,fileHead **);
		if (fileHd_2)
		{
		i = 0;
		while (fileHd_2[i])
		{
			if (fileHd_2[i]->fileName)
				free (fileHd_2[i]->fileName);
			free (fileHd_2[i]);
		}
		free (fileHd_2);
		}
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case DEL_FILE:
		file_2 = va_arg (ap,FILE **);
		if (file_2)
		{
			if (file_2[0])
				fclose (file_2[0]);
			if (file_2[1])
				fclose (file_2[1]);
		}
		fileHd_2 = va_arg (ap,fileHead **);
		if (fileHd_2)
		{
		i = 0;
		while (fileHd_2[i])
		{
			if (fileHd_2[i]->fileName)
				free (fileHd_2[i]->fileName);
			free (fileHd_2[i]);
		}
		free (fileHd_2);
		}
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case EXTR_FILE:
			file_1 = va_arg (ap,FILE *);
		if (file_1)
			fclose (file_1);
		fileHd_2 = va_arg (ap,fileHead **);
		if (fileHd_2)
		{
			i = 0;
			while (fileHd_2[i])
			{
				if (fileHd_2[i]->fileName)
				free (fileHd_2[i]->fileName);
				free (fileHd_2[i]);
			}
			free (fileHd_2);
		}
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case EXTR_FILE_:
			file_1 = va_arg (ap, FILE *);
		if (file_1)
			fclose (file_1);
		file_1 = va_arg (ap,FILE *);
		if (file_1)
			fclose (file_1);
		fileHd_1 = va_arg (ap,fileHead *);
		if (fileHd_1)
		{
			if (fileHd_1->fileName)
				free (fileHd_1->fileName);
			free (fileHd_1);
		}
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case LISTING_FILE:
		file_1 = va_arg (ap,FILE *);
		if (file_1)
			fclose (file_1);
		fileHd_2 = va_arg (ap,fileHead **);
		if (fileHd_2)
		{
			i = 0;
			while (fileHd_2[i])
			{
				if (fileHd_2[i]->fileName)
				free (fileHd_2[i]->fileName);
				free (fileHd_2[i]);
			}
			free (fileHd_2);
		}
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case OPEN_ARC:
		file_2 = va_arg (ap,FILE **);
		if (file_2)
		{
			if (file_2[0])
				fclose (file_2[0]);
			if (file_2[1])
				fclose (file_2[1]);
		}
		statFile = va_arg (ap,struct stat *);
		if (statFile)
			free (statFile);
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	case TESTING:
		file_1 = va_arg (ap,FILE *);
		if (file_1)
			fclose (file_1);
		buf_1 = va_arg (ap,char *);
		if (buf_1)
			free (buf_1);
		va_end (ap);
		longjmp (errorBuf,flag);
		break;
	default : longjmp (errorBuf,56);
	}
	return 0;
}